home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / rfc822.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-10-13  |  19.9 KB  |  905 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import time
  5. __all__ = [
  6.     'Message',
  7.     'AddressList',
  8.     'parsedate',
  9.     'parsedate_tz',
  10.     'mktime_tz']
  11. _blanklines = ('\r\n', '\n')
  12.  
  13. class Message:
  14.     
  15.     def __init__(self, fp, seekable = 1):
  16.         if seekable == 1:
  17.             
  18.             try:
  19.                 fp.tell()
  20.             except (AttributeError, IOError):
  21.                 seekable = 0
  22.             except:
  23.                 None<EXCEPTION MATCH>(AttributeError, IOError)
  24.             
  25.  
  26.         None<EXCEPTION MATCH>(AttributeError, IOError)
  27.         self.fp = fp
  28.         self.seekable = seekable
  29.         self.startofheaders = None
  30.         self.startofbody = None
  31.         if self.seekable:
  32.             
  33.             try:
  34.                 self.startofheaders = self.fp.tell()
  35.             except IOError:
  36.                 self.seekable = 0
  37.             except:
  38.                 None<EXCEPTION MATCH>IOError
  39.             
  40.  
  41.         None<EXCEPTION MATCH>IOError
  42.         self.readheaders()
  43.         if self.seekable:
  44.             
  45.             try:
  46.                 self.startofbody = self.fp.tell()
  47.             except IOError:
  48.                 self.seekable = 0
  49.             except:
  50.                 None<EXCEPTION MATCH>IOError
  51.             
  52.  
  53.         None<EXCEPTION MATCH>IOError
  54.  
  55.     
  56.     def rewindbody(self):
  57.         if not self.seekable:
  58.             raise IOError, 'unseekable file'
  59.         
  60.         self.fp.seek(self.startofbody)
  61.  
  62.     
  63.     def readheaders(self):
  64.         self.dict = { }
  65.         self.unixfrom = ''
  66.         self.headers = lst = []
  67.         self.status = ''
  68.         headerseen = ''
  69.         firstline = 1
  70.         startofline = None
  71.         unread = None
  72.         tell = None
  73.         if hasattr(self.fp, 'unread'):
  74.             unread = self.fp.unread
  75.         elif self.seekable:
  76.             tell = self.fp.tell
  77.         
  78.         while tell:
  79.             
  80.             try:
  81.                 startofline = tell()
  82.             except IOError:
  83.                 startofline = None
  84.                 tell = None
  85.                 self.seekable = 0
  86.             except:
  87.                 None<EXCEPTION MATCH>IOError
  88.             
  89.  
  90.             None<EXCEPTION MATCH>IOError
  91.             line = self.fp.readline()
  92.             if not line:
  93.                 self.status = 'EOF in headers'
  94.                 break
  95.             
  96.         if firstline and line.startswith('From '):
  97.             self.unixfrom = self.unixfrom + line
  98.             continue
  99.         
  100.         firstline = 0
  101.         if headerseen and line[0] in ' \t':
  102.             lst.append(line)
  103.             x = self.dict[headerseen] + '\n ' + line.strip()
  104.             self.dict[headerseen] = x.strip()
  105.             continue
  106.         elif self.iscomment(line):
  107.             continue
  108.         elif self.islast(line):
  109.             break
  110.         
  111.         headerseen = self.isheader(line)
  112.         if headerseen:
  113.             lst.append(line)
  114.             self.dict[headerseen] = line[len(headerseen) + 1:].strip()
  115.             continue
  116.             continue
  117.         if not self.dict:
  118.             self.status = 'No headers'
  119.         else:
  120.             self.status = 'Non-header line where header expected'
  121.         if unread:
  122.             unread(line)
  123.         elif tell:
  124.             self.fp.seek(startofline)
  125.         else:
  126.             self.status = self.status + '; bad seek'
  127.         break
  128.         continue
  129.  
  130.     
  131.     def isheader(self, line):
  132.         i = line.find(':')
  133.         if i > 0:
  134.             return line[:i].lower()
  135.         
  136.  
  137.     
  138.     def islast(self, line):
  139.         return line in _blanklines
  140.  
  141.     
  142.     def iscomment(self, line):
  143.         return False
  144.  
  145.     
  146.     def getallmatchingheaders(self, name):
  147.         name = name.lower() + ':'
  148.         n = len(name)
  149.         lst = []
  150.         hit = 0
  151.         for line in self.headers:
  152.             if line[:n].lower() == name:
  153.                 hit = 1
  154.             elif not line[:1].isspace():
  155.                 hit = 0
  156.             
  157.             if hit:
  158.                 lst.append(line)
  159.                 continue
  160.         
  161.         return lst
  162.  
  163.     
  164.     def getfirstmatchingheader(self, name):
  165.         name = name.lower() + ':'
  166.         n = len(name)
  167.         lst = []
  168.         hit = 0
  169.         for line in self.headers:
  170.             if hit:
  171.                 if not line[:1].isspace():
  172.                     break
  173.                 
  174.             elif line[:n].lower() == name:
  175.                 hit = 1
  176.             
  177.             if hit:
  178.                 lst.append(line)
  179.                 continue
  180.         
  181.         return lst
  182.  
  183.     
  184.     def getrawheader(self, name):
  185.         lst = self.getfirstmatchingheader(name)
  186.         if not lst:
  187.             return None
  188.         
  189.         lst[0] = lst[0][len(name) + 1:]
  190.         return ''.join(lst)
  191.  
  192.     
  193.     def getheader(self, name, default = None):
  194.         return self.dict.get(name.lower(), default)
  195.  
  196.     get = getheader
  197.     
  198.     def getheaders(self, name):
  199.         result = []
  200.         current = ''
  201.         have_header = 0
  202.         for s in self.getallmatchingheaders(name):
  203.             if s[0].isspace():
  204.                 if current:
  205.                     current = '%s\n %s' % (current, s.strip())
  206.                 else:
  207.                     current = s.strip()
  208.             current
  209.             if have_header:
  210.                 result.append(current)
  211.             
  212.             current = s[s.find(':') + 1:].strip()
  213.             have_header = 1
  214.         
  215.         if have_header:
  216.             result.append(current)
  217.         
  218.         return result
  219.  
  220.     
  221.     def getaddr(self, name):
  222.         alist = self.getaddrlist(name)
  223.         if alist:
  224.             return alist[0]
  225.         else:
  226.             return (None, None)
  227.  
  228.     
  229.     def getaddrlist(self, name):
  230.         raw = []
  231.         for h in self.getallmatchingheaders(name):
  232.             if h[0] in ' \t':
  233.                 raw.append(h)
  234.                 continue
  235.             if raw:
  236.                 raw.append(', ')
  237.             
  238.             i = h.find(':')
  239.             if i > 0:
  240.                 addr = h[i + 1:]
  241.             
  242.             raw.append(addr)
  243.         
  244.         alladdrs = ''.join(raw)
  245.         a = AddressList(alladdrs)
  246.         return a.addresslist
  247.  
  248.     
  249.     def getdate(self, name):
  250.         
  251.         try:
  252.             data = self[name]
  253.         except KeyError:
  254.             return None
  255.  
  256.         return parsedate(data)
  257.  
  258.     
  259.     def getdate_tz(self, name):
  260.         
  261.         try:
  262.             data = self[name]
  263.         except KeyError:
  264.             return None
  265.  
  266.         return parsedate_tz(data)
  267.  
  268.     
  269.     def __len__(self):
  270.         return len(self.dict)
  271.  
  272.     
  273.     def __getitem__(self, name):
  274.         return self.dict[name.lower()]
  275.  
  276.     
  277.     def __setitem__(self, name, value):
  278.         del self[name]
  279.         self.dict[name.lower()] = value
  280.         text = name + ': ' + value
  281.         for line in text.split('\n'):
  282.             self.headers.append(line + '\n')
  283.         
  284.  
  285.     
  286.     def __delitem__(self, name):
  287.         name = name.lower()
  288.         if name not in self.dict:
  289.             return None
  290.         
  291.         del self.dict[name]
  292.         name = name + ':'
  293.         n = len(name)
  294.         lst = []
  295.         hit = 0
  296.         for i in range(len(self.headers)):
  297.             line = self.headers[i]
  298.             if line[:n].lower() == name:
  299.                 hit = 1
  300.             elif not line[:1].isspace():
  301.                 hit = 0
  302.             
  303.             if hit:
  304.                 lst.append(i)
  305.                 continue
  306.         
  307.         for i in reversed(lst):
  308.             del self.headers[i]
  309.         
  310.  
  311.     
  312.     def setdefault(self, name, default = ''):
  313.         lowername = name.lower()
  314.         if lowername in self.dict:
  315.             return self.dict[lowername]
  316.         else:
  317.             text = name + ': ' + default
  318.             for line in text.split('\n'):
  319.                 self.headers.append(line + '\n')
  320.             
  321.             self.dict[lowername] = default
  322.             return default
  323.  
  324.     
  325.     def has_key(self, name):
  326.         return name.lower() in self.dict
  327.  
  328.     
  329.     def __contains__(self, name):
  330.         return name.lower() in self.dict
  331.  
  332.     
  333.     def __iter__(self):
  334.         return iter(self.dict)
  335.  
  336.     
  337.     def keys(self):
  338.         return self.dict.keys()
  339.  
  340.     
  341.     def values(self):
  342.         return self.dict.values()
  343.  
  344.     
  345.     def items(self):
  346.         return self.dict.items()
  347.  
  348.     
  349.     def __str__(self):
  350.         return ''.join(self.headers)
  351.  
  352.  
  353.  
  354. def unquote(s):
  355.     if len(s) > 1:
  356.         if s.startswith('"') and s.endswith('"'):
  357.             return s[1:-1].replace('\\\\', '\\').replace('\\"', '"')
  358.         
  359.         if s.startswith('<') and s.endswith('>'):
  360.             return s[1:-1]
  361.         
  362.     
  363.     return s
  364.  
  365.  
  366. def quote(s):
  367.     return s.replace('\\', '\\\\').replace('"', '\\"')
  368.  
  369.  
  370. def parseaddr(address):
  371.     a = AddressList(address)
  372.     lst = a.addresslist
  373.     if not lst:
  374.         return (None, None)
  375.     
  376.     return lst[0]
  377.  
  378.  
  379. class AddrlistClass:
  380.     
  381.     def __init__(self, field):
  382.         self.specials = '()<>@,:;."[]'
  383.         self.pos = 0
  384.         self.LWS = ' \t'
  385.         self.CR = '\r\n'
  386.         self.atomends = self.specials + self.LWS + self.CR
  387.         self.phraseends = self.atomends.replace('.', '')
  388.         self.field = field
  389.         self.commentlist = []
  390.  
  391.     
  392.     def gotonext(self):
  393.         while self.pos < len(self.field):
  394.             if self.field[self.pos] in self.LWS + '\n\r':
  395.                 self.pos = self.pos + 1
  396.                 continue
  397.             if self.field[self.pos] == '(':
  398.                 self.commentlist.append(self.getcomment())
  399.                 continue
  400.             break
  401.  
  402.     
  403.     def getaddrlist(self):
  404.         result = []
  405.         ad = self.getaddress()
  406.         while ad:
  407.             result += ad
  408.             ad = self.getaddress()
  409.         return result
  410.  
  411.     
  412.     def getaddress(self):
  413.         self.commentlist = []
  414.         self.gotonext()
  415.         oldpos = self.pos
  416.         oldcl = self.commentlist
  417.         plist = self.getphraselist()
  418.         self.gotonext()
  419.         returnlist = []
  420.         if self.pos >= len(self.field):
  421.             if plist:
  422.                 returnlist = [
  423.                     (' '.join(self.commentlist), plist[0])]
  424.             
  425.         elif self.field[self.pos] in '.@':
  426.             self.pos = oldpos
  427.             self.commentlist = oldcl
  428.             addrspec = self.getaddrspec()
  429.             returnlist = [
  430.                 (' '.join(self.commentlist), addrspec)]
  431.         elif self.field[self.pos] == ':':
  432.             returnlist = []
  433.             fieldlen = len(self.field)
  434.             self.pos += 1
  435.             while self.pos < len(self.field):
  436.                 self.gotonext()
  437.                 returnlist = returnlist + self.getaddress()
  438.                 continue
  439.                 None if self.pos < fieldlen and self.field[self.pos] == ';' else self
  440.         elif self.field[self.pos] == '<':
  441.             routeaddr = self.getrouteaddr()
  442.             if self.commentlist:
  443.                 returnlist = [
  444.                     (' '.join(plist) + ' (' + ' '.join(self.commentlist) + ')', routeaddr)]
  445.             else:
  446.                 returnlist = [
  447.                     (' '.join(plist), routeaddr)]
  448.         elif plist:
  449.             returnlist = [
  450.                 (' '.join(self.commentlist), plist[0])]
  451.         elif self.field[self.pos] in self.specials:
  452.             self.pos += 1
  453.         
  454.         self.gotonext()
  455.         if self.pos < len(self.field) and self.field[self.pos] == ',':
  456.             self.pos += 1
  457.         
  458.         return returnlist
  459.  
  460.     
  461.     def getrouteaddr(self):
  462.         if self.field[self.pos] != '<':
  463.             return None
  464.         
  465.         expectroute = 0
  466.         self.pos += 1
  467.         self.gotonext()
  468.         adlist = ''
  469.         while self.pos < len(self.field):
  470.             if expectroute:
  471.                 self.getdomain()
  472.                 expectroute = 0
  473.             elif self.field[self.pos] == '>':
  474.                 self.pos += 1
  475.                 break
  476.             elif self.field[self.pos] == '@':
  477.                 self.pos += 1
  478.                 expectroute = 1
  479.             elif self.field[self.pos] == ':':
  480.                 self.pos += 1
  481.             else:
  482.                 adlist = self.getaddrspec()
  483.                 self.pos += 1
  484.                 break
  485.             self.gotonext()
  486.             continue
  487.             self
  488.         return adlist
  489.  
  490.     
  491.     def getaddrspec(self):
  492.         aslist = []
  493.         self.gotonext()
  494.         while self.pos < len(self.field):
  495.             if self.field[self.pos] == '.':
  496.                 aslist.append('.')
  497.                 self.pos += 1
  498.             elif self.field[self.pos] == '"':
  499.                 aslist.append('"%s"' % self.getquote())
  500.             elif self.field[self.pos] in self.atomends:
  501.                 break
  502.             else:
  503.                 aslist.append(self.getatom())
  504.             self.gotonext()
  505.         if self.pos >= len(self.field) or self.field[self.pos] != '@':
  506.             return ''.join(aslist)
  507.         
  508.         aslist.append('@')
  509.         self.pos += 1
  510.         self.gotonext()
  511.         return ''.join(aslist) + self.getdomain()
  512.  
  513.     
  514.     def getdomain(self):
  515.         sdlist = []
  516.         while self.pos < len(self.field):
  517.             if self.field[self.pos] in self.LWS:
  518.                 self.pos += 1
  519.                 continue
  520.             self
  521.             if self.field[self.pos] == '(':
  522.                 self.commentlist.append(self.getcomment())
  523.                 continue
  524.             if self.field[self.pos] == '[':
  525.                 sdlist.append(self.getdomainliteral())
  526.                 continue
  527.             if self.field[self.pos] == '.':
  528.                 self.pos += 1
  529.                 sdlist.append('.')
  530.                 continue
  531.             self
  532.             if self.field[self.pos] in self.atomends:
  533.                 break
  534.                 continue
  535.             sdlist.append(self.getatom())
  536.         return ''.join(sdlist)
  537.  
  538.     
  539.     def getdelimited(self, beginchar, endchars, allowcomments = 1):
  540.         if self.field[self.pos] != beginchar:
  541.             return ''
  542.         
  543.         slist = [
  544.             '']
  545.         quote = 0
  546.         self.pos += 1
  547.         while self.pos < len(self.field):
  548.             if quote == 1:
  549.                 slist.append(self.field[self.pos])
  550.                 quote = 0
  551.             elif self.field[self.pos] in endchars:
  552.                 self.pos += 1
  553.                 break
  554.             elif allowcomments and self.field[self.pos] == '(':
  555.                 slist.append(self.getcomment())
  556.                 continue
  557.             elif self.field[self.pos] == '\\':
  558.                 quote = 1
  559.             else:
  560.                 slist.append(self.field[self.pos])
  561.             self.pos += 1
  562.             continue
  563.             self
  564.         return ''.join(slist)
  565.  
  566.     
  567.     def getquote(self):
  568.         return self.getdelimited('"', '"\r', 0)
  569.  
  570.     
  571.     def getcomment(self):
  572.         return self.getdelimited('(', ')\r', 1)
  573.  
  574.     
  575.     def getdomainliteral(self):
  576.         return '[%s]' % self.getdelimited('[', ']\r', 0)
  577.  
  578.     
  579.     def getatom(self, atomends = None):
  580.         atomlist = [
  581.             '']
  582.         if atomends is None:
  583.             atomends = self.atomends
  584.         
  585.         while self.pos < len(self.field):
  586.             if self.field[self.pos] in atomends:
  587.                 break
  588.             else:
  589.                 atomlist.append(self.field[self.pos])
  590.             self.pos += 1
  591.             continue
  592.             self
  593.         return ''.join(atomlist)
  594.  
  595.     
  596.     def getphraselist(self):
  597.         plist = []
  598.         while self.pos < len(self.field):
  599.             if self.field[self.pos] in self.LWS:
  600.                 self.pos += 1
  601.                 continue
  602.             self
  603.             if self.field[self.pos] == '"':
  604.                 plist.append(self.getquote())
  605.                 continue
  606.             if self.field[self.pos] == '(':
  607.                 self.commentlist.append(self.getcomment())
  608.                 continue
  609.             if self.field[self.pos] in self.phraseends:
  610.                 break
  611.                 continue
  612.             plist.append(self.getatom(self.phraseends))
  613.         return plist
  614.  
  615.  
  616.  
  617. class AddressList(AddrlistClass):
  618.     
  619.     def __init__(self, field):
  620.         AddrlistClass.__init__(self, field)
  621.         if field:
  622.             self.addresslist = self.getaddrlist()
  623.         else:
  624.             self.addresslist = []
  625.  
  626.     
  627.     def __len__(self):
  628.         return len(self.addresslist)
  629.  
  630.     
  631.     def __str__(self):
  632.         return ', '.join(map(dump_address_pair, self.addresslist))
  633.  
  634.     
  635.     def __add__(self, other):
  636.         newaddr = AddressList(None)
  637.         newaddr.addresslist = self.addresslist[:]
  638.         for x in other.addresslist:
  639.             if x not in self.addresslist:
  640.                 newaddr.addresslist.append(x)
  641.                 continue
  642.         
  643.         return newaddr
  644.  
  645.     
  646.     def __iadd__(self, other):
  647.         for x in other.addresslist:
  648.             if x not in self.addresslist:
  649.                 self.addresslist.append(x)
  650.                 continue
  651.         
  652.         return self
  653.  
  654.     
  655.     def __sub__(self, other):
  656.         newaddr = AddressList(None)
  657.         for x in self.addresslist:
  658.             if x not in other.addresslist:
  659.                 newaddr.addresslist.append(x)
  660.                 continue
  661.         
  662.         return newaddr
  663.  
  664.     
  665.     def __isub__(self, other):
  666.         for x in other.addresslist:
  667.             if x in self.addresslist:
  668.                 self.addresslist.remove(x)
  669.                 continue
  670.         
  671.         return self
  672.  
  673.     
  674.     def __getitem__(self, index):
  675.         return self.addresslist[index]
  676.  
  677.  
  678.  
  679. def dump_address_pair(pair):
  680.     if pair[0]:
  681.         return '"' + pair[0] + '" <' + pair[1] + '>'
  682.     else:
  683.         return pair[1]
  684.  
  685. _monthnames = [
  686.     'jan',
  687.     'feb',
  688.     'mar',
  689.     'apr',
  690.     'may',
  691.     'jun',
  692.     'jul',
  693.     'aug',
  694.     'sep',
  695.     'oct',
  696.     'nov',
  697.     'dec',
  698.     'january',
  699.     'february',
  700.     'march',
  701.     'april',
  702.     'may',
  703.     'june',
  704.     'july',
  705.     'august',
  706.     'september',
  707.     'october',
  708.     'november',
  709.     'december']
  710. _daynames = [
  711.     'mon',
  712.     'tue',
  713.     'wed',
  714.     'thu',
  715.     'fri',
  716.     'sat',
  717.     'sun']
  718. _timezones = {
  719.     'UT': 0,
  720.     'UTC': 0,
  721.     'GMT': 0,
  722.     'Z': 0,
  723.     'AST': -400,
  724.     'ADT': -300,
  725.     'EST': -500,
  726.     'EDT': -400,
  727.     'CST': -600,
  728.     'CDT': -500,
  729.     'MST': -700,
  730.     'MDT': -600,
  731.     'PST': -800,
  732.     'PDT': -700 }
  733.  
  734. def parsedate_tz(data):
  735.     if not data:
  736.         return None
  737.     
  738.     data = data.split()
  739.     if data[0][-1] in (',', '.') or data[0].lower() in _daynames:
  740.         del data[0]
  741.     else:
  742.         i = data[0].rfind(',')
  743.         if i >= 0:
  744.             data[0] = data[0][i + 1:]
  745.         
  746.     if len(data) == 3:
  747.         stuff = data[0].split('-')
  748.         if len(stuff) == 3:
  749.             data = stuff + data[1:]
  750.         
  751.     
  752.     if len(data) == 4:
  753.         s = data[3]
  754.         i = s.find('+')
  755.         if i > 0:
  756.             data[3:] = [
  757.                 s[:i],
  758.                 s[i + 1:]]
  759.         else:
  760.             data.append('')
  761.     
  762.     if len(data) < 5:
  763.         return None
  764.     
  765.     data = data[:5]
  766.     (dd, mm, yy, tm, tz) = data
  767.     mm = mm.lower()
  768.     if mm not in _monthnames:
  769.         dd = mm
  770.         mm = dd.lower()
  771.         if mm not in _monthnames:
  772.             return None
  773.         
  774.     
  775.     mm = _monthnames.index(mm) + 1
  776.     if mm > 12:
  777.         mm = mm - 12
  778.     
  779.     if dd[-1] == ',':
  780.         dd = dd[:-1]
  781.     
  782.     i = yy.find(':')
  783.     if i > 0:
  784.         yy = tm
  785.         tm = yy
  786.     
  787.     if yy[-1] == ',':
  788.         yy = yy[:-1]
  789.     
  790.     if not yy[0].isdigit():
  791.         yy = tz
  792.         tz = yy
  793.     
  794.     if tm[-1] == ',':
  795.         tm = tm[:-1]
  796.     
  797.     tm = tm.split(':')
  798.     if len(tm) == 2:
  799.         (thh, tmm) = tm
  800.         tss = '0'
  801.     elif len(tm) == 3:
  802.         (thh, tmm, tss) = tm
  803.     else:
  804.         return None
  805.     
  806.     try:
  807.         yy = int(yy)
  808.         dd = int(dd)
  809.         thh = int(thh)
  810.         tmm = int(tmm)
  811.         tss = int(tss)
  812.     except ValueError:
  813.         return None
  814.  
  815.     tzoffset = None
  816.     tz = tz.upper()
  817.     if tz in _timezones:
  818.         tzoffset = _timezones[tz]
  819.     else:
  820.         
  821.         try:
  822.             tzoffset = int(tz)
  823.         except ValueError:
  824.             pass
  825.  
  826.     if tzoffset:
  827.         if tzoffset < 0:
  828.             tzsign = -1
  829.             tzoffset = -tzoffset
  830.         else:
  831.             tzsign = 1
  832.         tzoffset = tzsign * ((tzoffset // 100) * 3600 + (tzoffset % 100) * 60)
  833.     
  834.     return (yy, mm, dd, thh, tmm, tss, 0, 1, 0, tzoffset)
  835.  
  836.  
  837. def parsedate(data):
  838.     t = parsedate_tz(data)
  839.     if t is None:
  840.         return t
  841.     
  842.     return t[:9]
  843.  
  844.  
  845. def mktime_tz(data):
  846.     if data[9] is None:
  847.         return time.mktime(data[:8] + (-1,))
  848.     else:
  849.         t = time.mktime(data[:8] + (0,))
  850.         return t - data[9] - time.timezone
  851.  
  852.  
  853. def formatdate(timeval = None):
  854.     if timeval is None:
  855.         timeval = time.time()
  856.     
  857.     timeval = time.gmtime(timeval)
  858.     return '%s, %02d %s %04d %02d:%02d:%02d GMT' % (('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')[timeval[6]], timeval[2], ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[timeval[1] - 1], timeval[0], timeval[3], timeval[4], timeval[5])
  859.  
  860. if __name__ == '__main__':
  861.     import sys
  862.     import os
  863.     file = os.path.join(os.environ['HOME'], 'Mail/inbox/1')
  864.     if sys.argv[1:]:
  865.         file = sys.argv[1]
  866.     
  867.     f = open(file, 'r')
  868.     m = Message(f)
  869.     print 'From:', m.getaddr('from')
  870.     print 'To:', m.getaddrlist('to')
  871.     print 'Subject:', m.getheader('subject')
  872.     print 'Date:', m.getheader('date')
  873.     date = m.getdate_tz('date')
  874.     tz = date[-1]
  875.     date = time.localtime(mktime_tz(date))
  876.     if date:
  877.         print 'ParsedDate:', time.asctime(date),
  878.         hhmmss = tz
  879.         (hhmm, ss) = divmod(hhmmss, 60)
  880.         (hh, mm) = divmod(hhmm, 60)
  881.         print '%+03d%02d' % (hh, mm),
  882.         if ss:
  883.             print '.%02d' % ss,
  884.         
  885.         print 
  886.     else:
  887.         print 'ParsedDate:', None
  888.     m.rewindbody()
  889.     n = 0
  890.     while f.readline():
  891.         n += 1
  892.     print 'Lines:', n
  893.     print '-' * 70
  894.     print 'len =', len(m)
  895.     if 'Date' in m:
  896.         print 'Date =', m['Date']
  897.     
  898.     if 'X-Nonsense' in m:
  899.         pass
  900.     
  901.     print 'keys =', m.keys()
  902.     print 'values =', m.values()
  903.     print 'items =', m.items()
  904.  
  905.